



# 向量化: 指利用底层硬件指令（如SIMD）和优化算法对整个数组或数据集合执行批量操作，而非逐元素循环处理。
# 逐元素操作变为整个数组操作
# 数组在内存中连续存储，CPU可预加载数据块，减少缓存缺失
# 数组元素类型相同（如全为float64），避免Python动态类型检查开销

# apply()中的逻辑不要复杂​
# 原生函数要比np.vectorize(sum)更快； vectorize 普通函数操作转向量操作

# numpy 数值计算和矩阵计算
# pandas 表格处理和时间序列处理

# eval优化复杂计算  df = df.eval("result = (col1 + col2) / col3")  # 避免中间变量

# 空值处理
# df.fillna({'price': df['price'].median()}, inplace=True)  # 数值列
# df['category'].fillna('unknown', inplace=True)  # 分类列


# 高效I/O
df.to_parquet('data')  # 比CSV快5-10倍
df = pd.read_feather('data')  # 极速读取

# 主动释放内存
del df; gc.collect()  # 配合垃圾回收












# --------------------------- 分箱 ---------------------------
pandas
固定长度，cut
相等数量，qcut
条件分箱，between + loc
统计分箱，value_counts
numpy
基于边界分箱，digitize
自定义分箱， apply select



# --------------------------- 排序 ---------------------------
pandas
sort_values   按列
sort_index    行列，多级索引
nlargest      快速获得最大值
rank          排名
numpy
np.sort(arr)
arr.sort
np.argsort()
np.lexsort()
np.partition(arr, 3) 将最小的3个元素放左边



# --------------------------- 统计 ---------------------------
pandas
df.count  非空数量，用于数据质量检测
df.sum mean median
df.min max std var 
# ---------------------数据分布描述-------
df.describe 数据描述
df.quantile 小数 分位数
   percentile 分位数
series.value_counts 离散值频数
# ---------------------相关性分析-------
df.corr(method='pearson/spearman/kendall')    列 之间 相关系数矩阵 (线性关系/单调非线性关系/小样本秩相关)
df.cov     协方差矩阵
# ---------------------分组聚合与自定义-------
df.groupby().agg(可以写库中的标准函数如：std，mean； 也可以写自定义函数名)
# ---------------------索引排序-------
df.sort_index() / sort_values(by="A列") 按索引或数值排序
df.reindex(new_index, fill_value=0)： 调整索引结构（缺失值自动填充NaN） new_index 可以是数组
# ---------------------其他-------
df["A"].nunique() :  统计唯一值 相当于groupby count(1)
series.pct_change() :  计算百分比变化，如 第二个值 比前一个值增长 20%  [100, 110, 90]-->[NaN, 0.1, -0.181]

numpy
np.ptp(arr)  极差，最大值减最小值
np.histogram(data, bins=[0, 1, 2])   数据频数分布 [0-1) 之间有多少，  [1-2] 之间有多少
np.nanmean(), np.nansum()  忽略 nan 的均值和求和， 如果  np.mean() 中有 nan 那么结果也为nan
np.argmax() / np.argmin()​​：返回极值索引
​​np.cumsum() / np.cumprod()​​：累加和/累乘积  [1, 2, 3]-->[1, 3, 6]

# 基础统计	sum(), mean(), median()          	数据集中趋势分析
# 离散程度	std(), var(), ptp()	                数据波动性评估
# 分布分析	percentile(), histogram()	        数据分布形态探索
# 相关性	   corrcoef(), cov()	                变量关系分析（如金融风险）
# 缺失值处理	nanmean(), nanstd()	                含缺失数据集的统计计算

# 方差/标准差计算时，设置 ddof=1 表示样本无偏估计（默认 ddof=0 为总体估计）





# --------------------------- 关联 ---------------------------
 pd.concat([df1, df2], ignore_index=True/*重置索引*/) 沿轴（行或列）简单堆叠多个 DataFrame，无需键匹配
        会尝试自动转换为一个兼容的类型, int + object -->  object, 发生数值类型转换 会导致计算变慢
        如果发生列名不一致问题，会用 nan 补上
        形状不一致也可以计算


pd.merge(orders, customers, on='customer_id', how='inner') 基于一个或多个键（列）执行类似 SQL JOIN 的合并操作，需要列值匹配


df1.join(df2)  基于索引（行标签）合并 DataFrame  索引一致的数据集

df1.combine_first(df2)  另一个 DataFrame 的值填充当前 DataFrame 的缺失值（NaN）

df_old.update(df_new, overwrite=False)  用另一个 DataFrame 的非空值覆盖当前 DataFrame 的值 （df_new 如果是 空值不覆盖）

pd.merge_ordered(date_sales, date_clients, on='date', fill_method='ffill')
        按顺序合并时间序列等有序数据，支持前向/后向填充。


pd.merge_asof(df_trades, df_quotes, on='time', direction='forward')
        基于最近键合并（如 合并时间戳接近的数据）如果 两个df  中的 time 列 值相近，那么可以认为是同一行数据比如误差在1秒以内


merge  join  combine_first  水平方向合并



# --------------------------- 缺失值 ---------------------------
检测： df.isna()   df.isna().sum()
删除： df.dropna()  axis=0  删除缺失值的行，  subset=["列名"] 删除指定列缺失的行，   thresh=3 保留至少3个非缺失值的行
填充： df.fillna(0), df.fillna(df.mean()),  df['列名'].fillna(df['列名'].median(), inplace=True)  # 中位数填充（原地修改）
df.fillna(method='ffill') # 用前一个值填充（时间序列常用）

处理重复值：
    df.duplicated()                           # 标记重复行（首次出现为False）
    df.drop_duplicates()                      # 删除重复行（保留首次出现）
    df.drop_duplicates(subset=['列A','列B'])  # 按指定列去重

类型转换：
df['列名'] = df['列名'].astype('int')           # 转为整数
df['日期列'] = pd.to_datetime(df['日期列'])     # 转为日期时间
df['类别列'] = df['类别列'].astype('category')  # 转为分类类型（节省内存）


异常值处理：
# --------分位数---------
# 四分位距法：基于数据分布的四分位数计算异常值边界（非正态分布数据）
lower = df['数值列'].quantile(0.05)    # 下界（5%分位数）
upper = df['数值列'].quantile(0.95)    # 上界（95%分位数）
df_clean = df[(df['数值列'] > lower) & (df['数值列'] < upper)]


# --------zscore---------
# 计算数据点与均值的标准差距离，超出±3倍标准差视为异常值（正太分布）
from scipy import stats
z_scores = stats.zscore(df['数值列'])
df_clean = df[(np.abs(z_scores) < 3)]  # 保留 |Z| < 3 的数据


# 还能使用箱线图辅助检测



# 异常值处理：
# 1. 比例小于5%， 且不具有代表性时，可以直接删除
# 2. 用clip 将超出边界的，替换为边界值 
# 3. 插值法：时间序列或有序数据，利用前后值推测异常值 df['column'] = df['column'].interpolate(method='linear')

# ​​保留异常值​​：若异常反映真实事件（如金融欺诈），需单独分析

# 实践操作：
#     1. 分箱（离散化）
#     2. 条件过滤清晰
#     3. 合并数据集合 combine